/**
 * traceId生成工具
 * 生成规则：
 * 前6位：服务器IP地址的十六进制表示
 * 中间15位：当前时间戳（yyMMddHHmmssSSS格式）
 * 后6位：自增序列（4位）+ 进程ID（2位）
 */

let sequence = 0; // 自增序列

/**
 * 获取服务器IP地址的十六进制表示（前6位）
 * 由于前端无法直接获取服务器IP，这里使用一个模拟值
 * 实际部署时可以通过环境变量或配置文件设置
 */
function getServerIPHex() {
  // 默认使用127.0.0.1的十六进制表示，实际项目中可以通过环境变量配置
  const defaultIP = '7F0001'; // 127.0.0.1的十六进制表示
  return defaultIP;
}

/**
 * 获取当前时间戳（yyMMddHHmmssSSS格式，15位）
 */
function getTimestamp() {
  const now = new Date();
  const year = now.getFullYear().toString().slice(-2);
  const month = (now.getMonth() + 1).toString().padStart(2, '0');
  const day = now.getDate().toString().padStart(2, '0');
  const hours = now.getHours().toString().padStart(2, '0');
  const minutes = now.getMinutes().toString().padStart(2, '0');
  const seconds = now.getSeconds().toString().padStart(2, '0');
  const milliseconds = now.getMilliseconds().toString().padStart(3, '0');
  
  return year + month + day + hours + minutes + seconds + milliseconds;
}

/**
 * 获取进程ID（2位）
 * 前端环境中使用随机数模拟进程ID
 */
function getProcessId() {
  // 在前端环境中，使用随机数作为进程ID的替代
  return Math.floor(Math.random() * 100).toString().padStart(2, '0');
}

/**
 * 生成自增序列（4位）
 */
function getSequence() {
  sequence = (sequence + 1) % 10000; // 循环使用0-9999
  return sequence.toString().padStart(4, '0');
}

/**
 * 生成traceId
 */
export function generateTraceId() {
  const serverIP = getServerIPHex();
  const timestamp = getTimestamp();
  const seq = getSequence();
  const processId = getProcessId();
  
  return serverIP + timestamp + seq + processId;
}

/**
 * 设置服务器IP地址（用于实际部署时配置）
 * @param {string} ip - 服务器IP地址
 */
export function setServerIP(ip) {
  // 实际部署时可以通过调用此函数设置真实的服务器IP
  // 这里可以存储到localStorage或全局变量中
  if (typeof window !== 'undefined') {
    localStorage.setItem('server_ip', ip);
  }
}

/**
 * 从IP地址获取十六进制表示
 * @param {string} ip - IP地址，如：192.168.1.1
 * @returns {string} - 6位十六进制表示
 */
export function ipToHex(ip) {
  if (!ip || typeof ip !== 'string') {
    return '000000';
  }
  
  const parts = ip.split('.');
  if (parts.length !== 4) {
    return '000000';
  }
  
  let hex = '';
  for (let i = 0; i < 3; i++) {
    const num = parseInt(parts[i] || '0', 10);
    hex += num.toString(16).padStart(2, '0');
  }
  
  return hex.slice(0, 6).toUpperCase();
}